﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Data;
using System.IO;

namespace Valgmotor.Controller
{
    class DatabaseController
    {
        SqlCommand sqlComm;
        SqlConnection sqlCon;
        StreamReader sr;
        const string connString = @"Data Source=msdb3.surftown.dk;Initial Catalog=mitoden_dbgr20;User ID=mitoden_dbgr20;Password=dmgruppebjbu";
        //const string connString = @"Data Source=localhost;Initial Catalog=Valgmaskine;Integrated Security = true";

        public DatabaseController()
        {
            sqlComm = new SqlCommand();
            sqlCon= new SqlConnection();
            sqlCon.ConnectionString = connString;
            sqlComm.Connection = sqlCon;
           
        }

        // Kald til at kører x-antal stemmer i DB
        public void Stemme()
        {
        }

        // Nul_Kørselskald
        public void NulKørsel(string[] csvFiler)
        {
            
            for (int i = 0; i < csvFiler.Length; i++)
            {
                switch (Path.GetFileNameWithoutExtension(Path.GetFileName(csvFiler[i])))
                {
                    case "6_Kandidat_NUL":
                        sr = new StreamReader(csvFiler[i]);
                        ParseKandidat();
                        sr.Close();
                        break;
                    case "1_Parti_NUL":
                        sr = new StreamReader(csvFiler[i]);
                        ParseParti();
                        sr.Close();
                        break;
                    case "3_StorKreds_NUL":
                        sr = new StreamReader(csvFiler[i]);
                        ParseStorKreds();
                        sr.Close();
                        break;
                    case "2_Landsdel_NUL":
                        sr = new StreamReader(csvFiler[i]);
                        ParseLandsdel();
                        sr.Close();
                        break;
                    case "4_ValgKreds_NUL":
                        sr = new StreamReader(csvFiler[i]);
                        ParseValgKreds();
                        sr.Close();
                        break;
                    case "5_ValgSted_NUL":
                        sr = new StreamReader(csvFiler[i]);
                        ParseValgSted();
                        sr.Close();
                        break;
                }
            }
            
            
        }

        // Parse Kald
        public void ParseKandidat()
        {
            while (!sr.EndOfStream)
            {
                string line = sr.ReadLine();
                string[] række = line.Split(';');
                OpretKandidat(række[1], række[0], int.Parse(række[2]));
            }
        }
        public void ParseStorKreds()
        {
            while (!sr.EndOfStream)
            {
                string line = sr.ReadLine();
                string[] række = line.Split(';');
                OpretStorKreds(række[1], int.Parse(række[0]),int.Parse(række[2]));
            }
        }
        public void ParseLandsdel()
        {
            while (!sr.EndOfStream)
            {
                string line = sr.ReadLine();
                string[] række = line.Split(';');
                OpretLandsdel(række[0], int.Parse(række[1]));
            }
        }
        public void ParseParti()
        {
            while (!sr.EndOfStream)
            {
                string line = sr.ReadLine();
                string[] række = line.Split(';');
               OpretParti(række[0], række[1]);
            }
        }
        public void ParseValgKreds()
        {
            while (!sr.EndOfStream)
            {
                string line = sr.ReadLine();
                string[] række = line.Split(';');
                OpretValgKreds(række[0], int.Parse(række[2]), int.Parse(række[1]));
            }
        }
        public void ParseValgSted()
        {
            while (!sr.EndOfStream)
            {
                string line = sr.ReadLine();
                string[] række = line.Split(';');
                OpretValgSted(række[0], række[1], int.Parse(række[2]));
            }
        }

        // Opret Kald
        public void OpretKandidat(string navn, string parti, int kreds)
        {
            sqlComm.Parameters.Clear();
            
            sqlComm.CommandType = CommandType.StoredProcedure;
            sqlComm.CommandText = "opretKandidat";

            SqlParameter par = new SqlParameter("@kNavn", SqlDbType.VarChar);
            par.Value = navn;
            sqlComm.Parameters.Add(par);

            par = new SqlParameter("@kParti", SqlDbType.NVarChar);
            par.Value = parti;
            sqlComm.Parameters.Add(par);

            par = new SqlParameter("@kValgKreds", SqlDbType.Int);
            par.Value = kreds;
            sqlComm.Parameters.Add(par);

            try
            {
                sqlCon.Open();

                sqlComm.ExecuteNonQuery();
            }
            catch (Exception ex)
            {

                throw ex.InnerException;
            }
            finally
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close();
                }
            }
        }
        public void OpretParti(string bogstav, string navn)
        {
            sqlComm.Parameters.Clear();

            sqlComm.CommandType = CommandType.StoredProcedure;
            sqlComm.CommandText = "opretParti";

            SqlParameter par = new SqlParameter("@pBogstav", SqlDbType.NVarChar);
            par.Value = bogstav;
            sqlComm.Parameters.Add(par);

            par = new SqlParameter("@pNavn", SqlDbType.VarChar);
            par.Value = navn;
            sqlComm.Parameters.Add(par);

            try
            {
                sqlCon.Open();
                sqlComm.ExecuteNonQuery();
                sqlCon.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close();
                }
            }
        }
        public void OpretStorKreds(string navn, int idStorKreds, int idKommune)
        {
            sqlComm.Parameters.Clear();

            sqlComm.CommandType = CommandType.StoredProcedure;
            sqlComm.CommandText = "opretStorKreds";

            SqlParameter par = new SqlParameter("@skNavn", SqlDbType.VarChar);
            par.Value = navn;
            sqlComm.Parameters.Add(par);

            par = new SqlParameter("@skId", SqlDbType.Int);
            par.Value = idKommune;
            sqlComm.Parameters.Add(par);

            par = new SqlParameter("@skLandsdel", SqlDbType.Int);
            par.Value = idStorKreds;
            sqlComm.Parameters.Add(par);

            try
            {
                sqlCon.Open();

                sqlComm.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                
                throw ex.InnerException;
            }
            finally
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close();
                }
            }
        }
        public void OpretLandsdel(string landskreds, int landskredsId)
        {
            sqlComm.Parameters.Clear();

            sqlComm.CommandType = CommandType.StoredProcedure;
            sqlComm.CommandText = "opretLandsdel";

            SqlParameter par = new SqlParameter("@askNavn", SqlDbType.VarChar);
            par.Value = landskreds;
            sqlComm.Parameters.Add(par);

            par = new SqlParameter("@askId", SqlDbType.Int);
            par.Value = landskredsId;
            sqlComm.Parameters.Add(par);

            try
            {
                sqlCon.Open();

                sqlComm.ExecuteNonQuery();
            }
            catch (Exception ex)
            {

                throw ex.InnerException;
            }
            finally
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close();
                }
            }
        }
        public void OpretValgKreds(string navn, int valgKredsId, int StorKredsId)
        {
            sqlComm.Parameters.Clear();
            sqlComm.CommandType = CommandType.StoredProcedure;
            sqlComm.CommandText = "opretValgKreds";

            SqlParameter par = new SqlParameter("@oId", SqlDbType.Int);
            par.Value = valgKredsId;
            sqlComm.Parameters.Add(par);

            par = new SqlParameter("@oNavn", SqlDbType.VarChar);
            par.Value = navn;
            sqlComm.Parameters.Add(par);

            par = new SqlParameter("@oStorKreds", SqlDbType.Int);
            par.Value = StorKredsId;
            sqlComm.Parameters.Add(par);

            try
            {
                sqlCon.Open();

                sqlComm.ExecuteNonQuery();
            }
            catch (Exception ex)
            {

                throw ex;
            }
            finally
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close();
                }
            }

        }
        public void OpretValgSted(string navn, string adresse, int valgKredsId)
        {
            sqlComm.Parameters.Clear();
            sqlComm.CommandType = CommandType.StoredProcedure;
            sqlComm.CommandText = "opretValgSted";

            SqlParameter par = new SqlParameter("@aNavn", SqlDbType.VarChar);
            par.Value = navn;
            sqlComm.Parameters.Add(par);

            par = new SqlParameter("@aAdresse", SqlDbType.VarChar);
            par.Value = adresse;
            sqlComm.Parameters.Add(par);

            par = new SqlParameter("@aKreds", SqlDbType.Int);
            par.Value = valgKredsId;
            sqlComm.Parameters.Add(par);

            try
            {
                sqlCon.Open();

                sqlComm.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (sqlCon.State == ConnectionState.Open)
                {
                    sqlCon.Close();
                }
            }
        }

        
        

    }
}
